iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
AI Engineering

Java × AI:30天打造智慧健康助理系列 第 7

第一個健康功能!

  • 分享至 

  • xImage
  •  

Day 7|第一個健康功能!用 Java 做 BMI 計算器

昨天的 Day 6,我們學會了使用 @RequestParam 接收使用者從網址傳進來的資料。

例如:

/hello?name=Hannie

Spring Boot 可以取得:

name = Hannie

既然已經會接收資料了,今天終於可以開始做第一個真正跟「健康」有關的功能!

今天的目標是:

讓使用者輸入身高與體重,再由 Java 自動計算 BMI。

也就是把網址變成:

/bmi?height=162&weight=50

然後讓 Spring Boot 告訴我們 BMI 是多少。

終於開始有一點健康助理的樣子了 XD


一、BMI 是什麼?

BMI 的全名是:

Body Mass Index

中文通常稱為「身體質量指數」。

它是利用身高與體重計算出來的一個數值。

公式是:

BMI = 體重(kg) ÷ 身高²(m²)

例如:

身高 = 162 cm
體重 = 50 kg

因為公式中的身高單位是「公尺」,所以要先把:

162 cm

轉換成:

1.62 m

接著代入公式:

BMI = 50 ÷ (1.62 × 1.62)

計算後大約是:

19.05

所以今天要做的事情,其實可以拆成:

接收身高與體重
      ↓
把身高從 cm 轉成 m
      ↓
計算 BMI
      ↓
回傳結果

二、先建立 BMI API

昨天已經使用過:

@RequestParam

所以今天可以直接利用它,同時接收兩個參數。

先建立:

@GetMapping("/bmi")

完整程式:

@GetMapping("/bmi")
public String calculateBMI(
        @RequestParam double height,
        @RequestParam double weight) {

    return "Height: " + height + ", Weight: " + weight;
}

這次和昨天最大的不同,就是一次使用了兩個 @RequestParam

@RequestParam double height

以及:

@RequestParam double weight

代表 Spring Boot 會分別接收:

height

和:

weight

兩個資料。


三、測試看看有沒有收到資料

重新啟動 Spring Boot 後,在瀏覽器輸入:

http://localhost:8080/bmi?height=162&weight=50

這裡第一次出現了兩個參數。

可以拆成:

height=162

以及:

weight=50

兩個參數之間使用:

&

連接。

所以:

/bmi?height=162&weight=50

可以理解成:

height = 162
weight = 50

如果程式成功取得資料,就會回傳類似:

Height: 162.0, Weight: 50.0

這代表 Spring Boot 已經成功收到身高與體重!


四、開始計算 BMI

資料成功傳進 Java 之後,下一步就是計算 BMI。

BMI 的公式是:

BMI = 體重(kg) ÷ 身高²(m²)

但是使用者輸入的身高是:

162 cm

所以第一步要先把公分轉成公尺:

double heightInMeters = height / 100;

例如:

162 ÷ 100 = 1.62

接著就可以計算 BMI:

double bmi = weight / (heightInMeters * heightInMeters);

完整的程式變成:

@GetMapping("/bmi")
public String calculateBMI(
        @RequestParam double height,
        @RequestParam double weight) {

    double heightInMeters = height / 100;

    double bmi = weight / (heightInMeters * heightInMeters);

    return "Your BMI is: " + bmi;
}

五、第一次計算成功!

重新執行後,再輸入:

http://localhost:8080/bmi?height=162&weight=50

這次 Spring Boot 就會進行真正的計算。

流程變成:

使用者輸入
height = 162
weight = 50
      ↓
@RequestParam
      ↓
Java 收到資料
      ↓
162 cm → 1.62 m
      ↓
50 ÷ (1.62 × 1.62)
      ↓
BMI ≈ 19.05
      ↓
回傳結果

但是實際執行的時候,可能會發現一個小問題。

Java 回傳的數字可能會變成:

19.05197378448407

這好像有點太長了 XD

所以接下來要把它整理得好看一點。


六、讓 BMI 只顯示兩位小數

我們其實不需要顯示那麼多位小數。

所以可以使用:

String.format("%.2f", bmi)

其中:

%.2f

代表:

把浮點數顯示到小數點後兩位。

修改後:

@GetMapping("/bmi")
public String calculateBMI(
        @RequestParam double height,
        @RequestParam double weight) {

    double heightInMeters = height / 100;

    double bmi = weight / (heightInMeters * heightInMeters);

    return "Your BMI is: " + String.format("%.2f", bmi);
}

現在重新輸入:

http://localhost:8080/bmi?height=162&weight=50

結果就會變成:

Your BMI is: 19.05

看起來舒服多了!


七、加入基本的錯誤處理

做到這裡,我又想到一個問題:

如果使用者輸入:

/bmi?height=0&weight=50

怎麼辦?

身高不可能是 0,而且如果直接拿 0 去計算,也沒有意義。

所以可以先加入一個簡單的判斷:

if (height <= 0 || weight <= 0) {
    return "Height and weight must be greater than 0.";
}

完整程式:

@GetMapping("/bmi")
public String calculateBMI(
        @RequestParam double height,
        @RequestParam double weight) {

    if (height <= 0 || weight <= 0) {
        return "Height and weight must be greater than 0.";
    }

    double heightInMeters = height / 100;

    double bmi = weight / (heightInMeters * heightInMeters);

    return "Your BMI is: " + String.format("%.2f", bmi);
}

這樣如果使用者輸入不合理的數字,程式就不會直接進行計算。

雖然目前只是非常簡單的判斷,但也讓我開始發現:

寫程式不能只考慮「正確輸入」,也要思考使用者可能輸入什麼奇怪的東西。


八、目前的 BMI API

現在我們的 BMI API 已經可以做到:

  • 接收身高
  • 接收體重
  • 將公分轉換成公尺
  • 計算 BMI
  • 顯示到小數點後兩位
  • 判斷身高與體重是否大於 0

目前的網址:

http://localhost:8080/bmi?height=162&weight=50

整個流程就是:

使用者
   ↓
輸入 height、weight
   ↓
Spring Boot
   ↓
@RequestParam
   ↓
Java
   ↓
BMI 計算
   ↓
回傳結果

到這裡,我們終於完成了第一個真正具有「功能」的 API。


九、但是現在還不夠「智慧」

雖然已經可以算出:

Your BMI is: 19.05

但仔細想想,現在的程式其實只是:

BMI 計算機

跟「智慧健康助理」還有一段距離 XD

所以接下來可以思考:

如果系統除了告訴使用者:

BMI = 19.05

還能進一步整理資訊,使用起來應該會更完整。

不過這也讓我發現一件事情:

有固定公式的計算,其實根本不需要交給 AI。

例如 BMI:

輸入數值
↓
Java 計算
↓
得到確定的結果

這種事情直接讓 Java 做反而比較適合。

等之後遇到需要理解自然語言、整理文字資訊的功能,再交給 AI。

這也符合前幾天規劃的:

Java 負責資料與邏輯,AI 負責理解與產生文字。


十、今天比昨天多了什麼?

昨天 Day 6 做到的是:

使用者輸入資料
↓
Java 收到資料
↓
把資料放進一句話

今天則進一步變成:

使用者輸入資料
↓
Java 收到資料
↓
進行計算
↓
判斷資料是否合理
↓
整理結果
↓
回傳給使用者

這也是第一次真正利用使用者輸入的資料完成一個功能。


Day 7 小結

今天終於完成智慧健康助理的第一個健康功能:

BMI 計算器!

也第一次同時使用兩個:

@RequestParam

接收:

height
weight

再利用 Java 進行計算。

今天也學到了一個很重要的觀念:

不是所有功能都需要 AI。

像 BMI 這種具有固定公式的功能,Java 就可以很準確地完成。

AI 應該留給更適合它的工作,例如理解文字、整理資訊與產生自然語言回覆。

現在我們的智慧健康助理,終於不只是會說 Hello 了!


上一篇
讓 Spring Boot 接收使用者輸入
系列文
Java × AI:30天打造智慧健康助理7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言